<?php
/***
*	Classe : ecFormElement
*
*   Notes : La classe abstraite ecFormElement est la parente de toutes les classes contenues dans le dossier elements.
*   Elle contient tous les attributs et les méthodes similaires des éléments de formulaires
*
*
*/

abstract class ecFormElement
{
	/***
	* La valeur défaut de l'élément
	* @var protected string value
	*/
	protected $value;

	/***
	* La label correspondant à l'élément de formulaire
	* @var protected string label
	*/
	protected $label;

	/***
	* Le nom de l'élément de formulaire
	* @var protected string name
	*/
	protected $name;

	/***
	* Indique si l'élément de formulaire est indispensable
	* @var protected bool required
	*/
	protected $required;

	/***
	* L'id de l'élément de formulaire
	* @var protected string id
	*/
	protected $id;

	/***
	* Le choix par défaut de l'élément de formulaire, si c'est une checkBox, radio, ou liste de sélection
	* @var protected string defaultChoice
	*/
	protected $defaultChoice;

	/***
	* La hauteur du textarea
	* @var protected int height
	*/
	protected $height;

	/***
	* La largeur du textarea
	* @var protected int width
	*/
	protected $width;

	/***
	* La regex vérifiant la validité du contenu de l'élément de formulaire
	* @var protected string regex
	*/
	protected $regex;

	/***
	* Le nombre minimal de caractères que peut contenir l'élément de formulaire
	* @var protected int minlength
	*/
	protected $minlength = NULL;

	/***
	* Le nombre maximal de caractères que peut contenir l'élément de formulaire
	* @var protected int maxlength
	*/
	protected $maxlength = NULL;

	/***
	* Le format de l'élément date, où d = jours, m = mois, et y = année
	* @var protected string format
	*/
	protected $format;

	/***
	* Les erreurs de non-validité rencontrées lors de la soumisson du formulaire
	* @var protected array errors
	*/
	protected $errors = array();



	/***
	*
	* Le constructeur de la classe ZFormElement
	* Par défaut, required vaut TRUE
	*/
	public function __construct()
	{
		$this->required = TRUE;
	}

	/***
	*
	* Méthode accesseur qui renvoie le nom de l'élément de formulaire
	*
	* @return string name
	*/
	public function getName()
	{
		return $this->name;
	}

	/*** Les méthodes suivantes suivent toutes le même fonctionnement :
	* public function [nomAttribut]($[nomAttribut])
	* {
	*  		$this->[nomAttribut] = $[nomAttribut];
	*
	*		return $this;
	* }
	* Où [nomAttribut] est le nom de l'élément que la méthode modifie.
	*
	* @var string/int [nomAttribut]		La nouvelle valeur de l'attribut à modifier
	* @return ecFormElement				Retourne l'objet actuel
	*/

	public function name($name)
	{
		$this->name = $name;

		return $this;
	}
	
	public function label($label)
	{
		$this->label = $label;

		return $this;
	}

	public function value($value)
	{
		$this->value = $value;

		return $this;
	}
	public function required($required)
	{
		$this->required = (bool) $required;

		return $this;
	}

	public function id($id)
	{
		$this->id = $id;

		return $this;
	}

	public function defaultChoice($default)
	{
		$this->defaultChoice = $default;

		return $this;
	}

	public function minlength($min)
	{
		$this->minlength = $min;

		return $this;
	}

	public function maxlength($max)
	{
		$this->maxlength = $max;

		return $this;
	}

	public function width($width)
	{
		$this->width = $width;

		return $this;
	}

	public function height($height)
	{
		$this->height = $height;

		return $this;
	}
	/***
	* regex
	*
	* @var string regex		La regex de validation du contenu de l'élément de formulaire
	*
	*/
	public function regex($regex)
	{
		if(preg_match('#\#.+\#*+#', $regex))
		{
			$this->regex = $regex;
			return $this;
		}
		else return FALSE;
	}

	/***
	* idValid
	*
	* @var array array		L'array dans lequel les valeurs doivent être recherchées et validées
	* @return bool			Le résultat de l'analyse : TRUE si le formulaire est rempli comme l'utilisateur le désire, FALSE dans le cas contraire
	*/

	public function isValid($array)
	{
		if($this->required)
		{
			if(!isset($array[$this->name]) OR empty($array[$this->name]))
			{
				$this->errors[] = $this->label;
				return FALSE;
			}
		}
		if(!empty($this->regex))
		{
			if(!preg_match($this->regex, $array[$this->name]))
			{
				$this->errors[] = $this->label;
				return FALSE;
			}
		}
		if(!is_null($this->minlength))
		{
			if(strlen($array[$this->name]) < $this->minlength)
			{
				$this->errors[] = $this->label;
				return FALSE;
			}
		}
		if(!is_null($this->maxlength))
		{
			if(strlen($array[$this->name]) > $this->maxlength)
			{
				$this->errors[] = $this->label;
				return FALSE;
			}
			else return TRUE;
		}

			return TRUE;
	}

	/***
	* getError
	*
	* Retourne une éventuelle erreur liée à l'élément de formulaire
	* @return string	L'erreur
	*/
	public function getError()
	{
		if(empty($this->errors)) 
      return NULL;

		$out = '';

		foreach($this->errors as $f)
		{
			$out .= 'Le champ obligatoire <b>'.$f.'</b> est vide ou incorrectement rempli<br />'."\n";
		}

		return $out;
	}
}